package com.ybkj.o2o.mc.manager;


import com.ybkj.o2o.mc.common.DataGrid;
import com.ybkj.o2o.mc.common.query.PassengerQuery;
import com.ybkj.o2o.mc.common.query.PassengerQuery2;
import com.ybkj.o2o.mc.entity.Passenger;
import com.ybkj.o2o.mc.entity.PassengerAccount;

import java.util.List;
import java.util.Map;

/**
 * Created by shine on 15/8/19.
 */
public interface PassengerManager {
  /**
   * 根据主键查询乘客信息.
   */
  Passenger fetch(Long id);

  /**
   * 根据 电话,appkey查询是否存在乘客.
   *
   * @param phone  电话号码
   * @param appKey 系统key
   * @return true存在, false不存在
   */
  boolean existsByPhone(String phone, String appKey);

  /**
   * 根据身份证号码,appKey查询是否存在乘客.
   *
   * @param idcard 身份证号码
   * @param appKey 系统key
   * @return true存在, false不存在
   */
  boolean existsByIdcard(String idcard, String appKey);

  /**
   * 根据Email,appKey查询是否存在乘客.
   *
   * @param email  电子邮件地址
   * @param appKey 系统key
   * @return true存在，false不存在
   */
  boolean existsByEmail(String email, String appKey);

  /**
   * 保存乘客信息.
   *
   * @param passenger 乘客信息
   */
  Passenger insert(Passenger passenger);

  /**
   * 根据主键和appKey查询乘客.
   *
   * @param passengerId 乘客主键
   * @param appKey      系统key
   * @return 乘客信息
   */
  Passenger findByIdAndAppKey(Long passengerId, String appKey);

  /**
   * 根据电话和系统key查询乘客.
   *
   * @param phone  电话号码
   * @param appKey 系统key
   * @return 乘客信息
   */
  Passenger findByPhoneAndAppKey(String phone, String appKey);

  /**
   * 根据电子邮件和系统key查询乘客.
   *
   * @param email  电子邮件
   * @param appKey 系统key
   * @return 乘客信息
   */
  Passenger findByEmailAndAppKey(String email, String appKey);
  
  /**
   * 根据工号和系统key查询乘客
   * 
   * @param jobNumber
   * @param appKey
   * @return
   */
  Passenger findByJobNumberAndAppKey(String jobNumber, String appKey);
  
  /**
   * 根据姓名和系统key查询乘客
   * 
   * @param name
   * @param appKey
   * @return
   */
  Passenger findByNameAndAppKey(String Name, String appKey);

  /**
   * 根据身份证号码和系统key查询乘客.
   *
   * @param idcard 身份证号码
   * @param appKey 系统key
   * @return 乘客信息
   */
  Passenger findByIdcardAndAppKey(String idcard, String appKey);

  /**
   * 根据主键系统key更新乘客信息.
   *
   * @param passenger 乘客信息
   * @return 受影响行数
   */
  int update(Passenger passenger);
  
  /**
   * 根据主键系统key更新乘客完成订单信息.
   *
   * @param passenger 乘客信息
   * @return 受影响行数
   */
  int updateByDate(Passenger passenger);

  /**
   * 根据乘客主键和系统key删除乘客信息.
   *
   * @param passengerId 乘客主键
   * @param appKey      系统key
   * @return 受影响行数
   */
  int deletePassenger(Long passengerId, String appKey);

  /**
   * 根据乘客主键和系统key更新乘客位置信息.
   *
   * @param passenger 乘客信息
   * @return 受影响行数
   */
  int updateLocation(Passenger passenger);

  /**
   * 根据乘客主键和系统key更新用户黑名单状态.
   *
   * @param passenger 乘客信息
   * @return 受影响行数
   */
  int updateBlackList(Passenger passenger);

  /**
   * 根据乘客主键和系统key更新用户设备类型.
   *
   * @param passenger 乘客信息
   * @return 受影响行数
   */
  int updateDeviceType(Passenger passenger);

  /**
   * 根据乘客主键和系统key更新乘客开票金额.
   *
   * @param passenger 乘客信息
   * @return 受影响行数
   */
  int updateReceiptMoney(Passenger passenger);

  /**
   * 根据条件分页查询乘客信息.
   *
   * @param passengerQuery 查询条件
   */
  DataGrid<Passenger> findByPassengerQuery(PassengerQuery passengerQuery);

  /**
   * 根据条件统计乘客数量.
   *
   * @param passengerQuery 查询条件
   * @return 乘客数量
   */
  long countByPassengerQuery(PassengerQuery passengerQuery);

  /**
   * 查询乘客来源名字.
   *
   * @param appKey 系统key
   * @return 来源列表
   */
  List<String> findChannels(String appKey);

  /**
   * 根据公司,乘客名字查询余额总和.
   *
   * @param companyId     公司主键
   * @param passengerName 乘客名称
   * @param appKey        系统key
   * @return 余额总和
   */
  double sumDrawMoney(Long companyId, String passengerName, String appKey);

  /**
   * 根据公司、appKey和type查询所有乘客.
   */
  @Deprecated
  List<Passenger> findByTypeOrCompanyId(Integer type, Long companyId, String appKey);

  /**
   * 修改账户明细，余额信息.
   *
   * @param account      账户明细
   * @param passenger    乘客基本信息
   * @param updateBlance 是否修改余额
   * @return 账户明细
   */
  PassengerAccount updateNoDrawMoney(PassengerAccount account, Passenger passenger,
                                     Boolean updateBlance);

  /**
   * 乘客充值.
   *
   * @param account        充值记录
   * @param passenger      乘客信息
   * @param updateBlance   是否更新余额信息
   * @param useNoDrawMoney 使用不可提现金额
   * @return 账户明细
   */
  PassengerAccount updateAccount(PassengerAccount account, Passenger passenger,
                                 Boolean updateBlance, Boolean useNoDrawMoney);

  /**
   * 根据条件复合查询乘客信息.
   *
   * @param passengerQuery 查询条件
   */
  DataGrid<Passenger> findByPassengerQuery2(PassengerQuery2 passengerQuery);

  /**
   * 根据条件统计乘客总数.
   *
   * @param passengerQuery2 查询条件
   * @return 乘客总数
   */
  Long countByPassengerQuery2(PassengerQuery2 passengerQuery2);
  
  /**
   * 根据条件复合查询乘客信息(去掉集合中的客户).
   *
   * @param passengerQuery 查询条件
   */
  DataGrid<Passenger> findByPassengerQuery3(PassengerQuery2 passengerQuery);

  /**
   * 根据条件统计乘客总数(去掉集合中的客户).
   *
   * @param passengerQuery2 查询条件
   * @return 乘客总数
   */
  Long countByPassengerQuery3(PassengerQuery2 passengerQuery2);

  /**
   * 根据企业主键查询企业下面的所有乘客信息.
   *
   * @param enterpriseId 企业主键
   * @param appKey       系统key
   * @return 乘客列表
   */
  List<Passenger> findByEnterprise(Long enterpriseId, String appKey);

  /**
   * 根据系统key查询一组电话号码是否有存在的数据.
   *
   * @param phones 电话号码
   * @param appKey 系统key
   * @return true存在, false不存在
   */
  boolean existsByPhones(List<String> phones, String appKey);

  /**
   * 批量保存用户信息.
   *
   * @param passengers 用户信息
   * @return 保存的记录数
   */
  int batchInsert(List<Passenger> passengers);

  int updateCompanyName(Long companyId,String abbreviation, String appKey);

  Map<String,Object> batchCreate(String passengers, String appKey);

  List<Passenger> findByGradeId(Long gradeId,String appKey);

  int disposeGrade(Long gradeId,String gradeName, Long companyId, String appKey);

  DataGrid<Passenger> findByIds(PassengerQuery passengerQuery);

  int batchDeleteByIds(List<Long> passengerIds, String appKey);

  int updateByDelDepartment(Long id, String appKey);

  int batchUpdateByIds(List<Long> passengerIds, String appKey);

  int updateEnterpriseName(Long enterpriseId, String enterpriseName, String appKey);

  int updateDepartmentName(Long departmentId, String departmentName, String appKey);

  int updateGradeByEnterpriseId(Long enterpriseId, Long gradeId, String gradeName, String appKey);

  int updateAllowOverdraw(Long enterpriseId, Boolean allowOverdraw, String appKey);

  Long findByIntroduceType(Integer introduceType,String introducer,Integer companyId,String appKey);

  int updateChannel(String appKey, String channelName, Long id);

  /***
   * 如果没有微信信息,那么去微信系统查询,获得了救过就更新,没有直接返回
   * @param ids
   * @return
   */
  List<Map<String, Object>> findWeixinInfoByIds(List<Long> ids);
}
